// 实现路由操作

const qs = require('querystring'); // 导入 querystring 模块

const dateformat = require('dateformat'); // 导入第三方模块: dateformat
const Router = require('router'); // 导入第三方模块: router

const render = require('./template.js'); // 导入自定义模块

// const empRouter = new Router(); // 将 Router 当作构造函数使用
const empRouter = Router(); // 将 Router 当作普通函数调用

empRouter.post('/add', (req, resp) => {
    let chunk = []; // 声明一个数组用来保存缓冲区
    req.on('data', (buf) => {
        chunk.push(buf); // 将缓冲区依次添加到chunk数组中
    });
    req.on('end', () => {
        let buffer = Buffer.concat(chunk); // 将数组中所有缓冲区连接成一个大缓冲区
        let str = buffer.toString(); // 将缓冲区解码为字符串
        let params = qs.decode(str); // 使用 querystring 模块提供的支持解析 字符串为 Objet实例
        // 来自请求参数的 params.birthdate 必须是符合 yyyy-MM-dd 格式
        params.birthdate = new Date(params.birthdate);
        let emp = new Employee(++identifier);
        Object.assign(emp, params); // 将params中属性值复制到emp相应的属性
        empArray.push(emp);
        console.log(empArray);
        // 重定向到 /list
        resp.writeHead(302, { 'location': '/list' });
        resp.end();
    });

});

empRouter.get('/list', (req, resp) => {
    // 设置 响应状态代码(200) 和 响应头(content-type)
    resp.writeHead(200, { 'content-type': 'text/html;charset=UTF-8' });
    // 务必注意这里指定的 名称是 employees ，所以在相应的模板中可以使用 employees 来访问数组
    let data = { employees: empArray };
    // 使用自定义模块提供的函数来渲染模板并返回结果
    let content = render('list', data);
    // 设置 响应正文
    resp.write(content);
    // 让响应结束
    resp.end();
});


empRouter.get('/remove', (req, resp) => {

    let input = req.url; // 从请求对象中获得本次请求路径
    let base = `http://${req.headers.host}`; // 从请求头中获得host字段的值
    // 这里使用 new URL 替代了 被废弃的 url.parse
    let url = new URL(input, base); // 在 global 上有一个 URL 对象
    let params = url.searchParams;
    if (params.has('id')) {
        let id = params.get('id');
        id = id * 1;

        let index = -1;
        for (let i = 0; i < empArray.length; i++) {
            // 通过对比id来确定被删除的元素索引
            if (empArray[i].id === id) {
                index = i;
                break;
            }
        }

        if (index != -1) {
            empArray.splice(index, 1);
        }
    }

    // 重定向到 /list
    resp.writeHead(302, { 'location': '/list' });
    resp.end();
});

// 更新页面
empRouter.get('/update', (req, resp) => {

    resp.writeHead(200, { 'content-type': 'text/html;charset=UTF-8' });

    let input = req.url; // 从请求对象中获得本次请求路径
    let base = `http://${req.headers.host}`; // 从请求头中获得host字段的值
    // 这里使用 new URL 替代了 被废弃的 url.parse
    let url = new URL(input, base); // 在 global 上有一个 URL 对象
    let params = url.searchParams;
    if (params.has('id')) {
        let id = params.get('id');
        id = id * 1;

        let e = null;
        for (let i = 0; i < empArray.length; i++) {
            let emp = empArray[i];
            // 通过对比id来确定即将被修改的元素索引
            if (emp.id === id) {
                e = emp;
                break;
            }
        }

        let data = { emp: e }

        // edit.art 是 修改员工 页面对应的模板文件
        let content = render('edit', data);

        resp.write(content);
    }
    resp.end();
});

// 更新操作
empRouter.post('/update', (req, resp) => {
    let chunk = []; // 声明一个数组用来保存缓冲区
    req.on('data', (buf) => {
        chunk.push(buf); // 将缓冲区依次添加到chunk数组中
    });
    req.on('end', () => {
        let buffer = Buffer.concat(chunk); // 将数组中所有缓冲区连接成一个大缓冲区
        let str = buffer.toString(); // 将缓冲区解码为字符串
        let params = qs.decode(str); // 使用 querystring 模块提供的支持解析 字符串为 Objet实例
        params.id = params.id * 1; // 将参数接受到的id由string转为number
        // 来自请求参数的 params.birthdate 必须是符合 yyyy-MM-dd 格式
        params.birthdate = new Date(params.birthdate);

        for (let i = 0; i < empArray.length; i++) {
            // 通过对比id来确定被修改的元素索引
            if (empArray[i].id === params.id) {
                // 将params中属性值复制到students[i]相应的属性
                Object.assign(empArray[i], params);
                break;
            }
        }
    });
    // 重定向到 /list
    resp.writeHead(302, { 'location': '/list' });
    resp.end();
});

// 为了方便使用，这里声明了一个 Employee对象
function Employee(id, name, gender, birthdate) {
    this.id = id;
    this.name = name;
    this.gender = gender;
    this.birthdate = birthdate;
}

// 使用 empArray 数组充当数据库
let empArray = []; // 声明一个用来存放Employee实例的数组
let identifier = 1000; // 用来表示员工编号的变量

// 将 empRouter 导出
module.exports = empRouter;